package cn.jsj.node;

import java.io.InputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


/**
 * 这里要注意的此xml文档的根会签必须是：resource<br>
 * 而此xml文档的根标签只可以为：sql，当然文档中sql的个数不限，可以没有，也可以有多个，而且此标签有一个必须的唯一属性id
 * 这里是解析xml文件的内容，最后返回的结果是<sql>内所有的内容，将并它存在map中，标签名是对应的key<br>
 * 而key对应的值也就是其标签的内容
 * 
 * @author 张尊伟
 * 
 */
public class ParseXML implements Serializable {

	private Document document = null;
	 private String parseXmlName=null;
	private static Map ParseXMLMap = new HashMap();

	// private static Map XMLValueMap = new HashMap();

	private ParseXML(String role) throws Exception {
		SAXReader reader = new SAXReader();
		this.parseXmlName=role;
		try {
			InputStream is = ParseXML.class.getResourceAsStream(role + ".xml");
			document = reader.read(is);
		} catch (DocumentException e) {
			throw new Exception("提供的资源文件不存在或者解析文件错误！", e);
		}
	}

	public static ParseXML getInstance(String role) throws Exception {
		ParseXML px = (ParseXML) ParseXMLMap.get(role);

		if (px == null) {
			px = new ParseXML(role);
			ParseXMLMap.put(role, px);
		}

		return px;
	}

	/**
	 * 这里返回dom4j的document对象
	 * 
	 * @return org.dom4j.Document
	 */
	public Document getDocument() {
		return document;
	}
	public String getParseXmlName() {
		return parseXmlName;
	}

	public void setParseXmlName(String parseXmlName) {
		this.parseXmlName = parseXmlName;
	}
	/**
	 * 这里根据<munTreeNode>标签的id属性行到此标签的所有子标签的值<br>
	 * 返回的结果是<munTreeNode>内所有的内容，将并它存在map中，标签名是对应的key<br>
	 * 而key对应的值也就是其标签的内容<br>
	 * 
	 * @param idValue:为xml中的KEY
	 *            如：root1，root2，root11，root21等
	 * @return:还回key对应的标签名内部的属性map
	 */
	public TreeNode getValueByXmlKey(String idValue) {
		TreeNode treeNode=null;
		List list = document.selectNodes("/SystemRoleMeuns/munTreeNode/@id");
		Iterator it = list.iterator();
		while (it.hasNext()) {
			Attribute attribute = (Attribute) it.next();
			if (!attribute.getValue().equals(idValue)) {
				continue;
			}
			TreeNode treenode = new TreeNode();
			treeNode=treenode;
			treenode.setId(idValue);
			Iterator it0 = attribute.getParent().elementIterator();
			Element el = null;
			while (it0.hasNext()) {
				el = (Element) it0.next();
				if (el.getName().equals("text")) {
					treenode.setText((String) el.getData());
				} else if (el.getName().equals("isLeaf")) {
					String isleaf=(String) el.getData();
					if (isleaf.equals("false")) {
						treenode.setLeaf(false);
					} else {
						treenode.setLeaf(true);
					}
				} else if (el.getName().equals("url")) {
					String url = (String) el.getData();
					if (url.equals("null")) {
						treenode.setUrl(null);
					} else {
						treenode.setUrl(url);
					}

				}
			}
			break;
		}
		return treeNode;
	}

	/**
	 * 根据父节点得到他的所有直接子节点，并以链表形式还回
	 * @param role:用户的权限，如：律师，主任，行政人员
	 * @param fatherId：父节点的id：如：root1，root2，root11，root21等
	 * @return:子节点链表
	 */
	public  List<TreeNode> productTreeNodesByFatherId(String fatherId){
		java.util.List<TreeNode> TreeNodeList=new java.util.ArrayList<TreeNode>();
	    for(int i=1;i<10;i++){
	    	 TreeNode node= this.getValueByXmlKey(fatherId+i);
	    	 if(node!=null){
	    		 TreeNodeList.add(node);
	    	 }
	    }
		return TreeNodeList;
	}
	
}
